package com.tedu.day02.oop;

/**
 * 抽象类特点<补充>
 * 类：成员变量/成员方法/构造方法
 * 抽象类：成员变量/成员方法/构造方法
 * 创建抽象类---普通类变成（实现）子类---继承抽象类
 * 成员变量：既可以是变量，也可以是常量
 * 构造方法：有，用于子类方法调用抽象【父】类的成员变量---赋值
 * 构造方法：既可以是抽象，也可以是非抽象
 * 抽象方法与非抽象方法出现在抽象类问题：
 * A：抽象方法   【重写】强制要求子类完成父类的抽象方法
 * B：非抽象方法 【拓展】子类继承的事情，提高代码复用性
 */

abstract class Foo{
    //成员变量
    public int i=10;
    public final int J=20;  //成员变量：常量
    //Java强类型语言：大小写分明
   // public int j=30;
    //构造方法：无参
    public Foo(){
        this(30); //调用当前类对象的其他构造器
    }
    public Foo(int i){
        this.i=i;
    }
    //成员方法:抽象方法
    public abstract void show();
    //成员方法：非抽象方法
    public void method(){
        System.out.println("Foo  method");
    }
}

//实现 {子}类
class Goo extends Foo{
    public void show(){
        System.out.println("Goo show");
    }
    public void method(){
        System.out.println("Goo method");
    }
}
public class 抽象类补充知识点 {
 public static void main(String[] args){
     //抽象类---继承---多态性---向上造型
     Foo f=new Goo();
     //①实例化---子类的构造器，默认存在无参构造器，
     //在通过super()调用父类无参构造器
     //②执行抽象类无参构造器，发现有this(参数)调用本类其他有参数构造器
     //③this调用的同时，完成对抽象类中 i进行赋值 i=30
     System.out.println(f.i);// ④输出：i的值   30
     //f.J=40;不可修改
     System.out.println(f.J);

     //--------------------------------------------
     f.show();   //输出：Goo show  重写
     f.method();//输出：Goo   method 拓展【子类方法重写】
   }
}
/**
 * 拓展：abstract关键共存问题
 */
abstract class Aoo{
   // private abstract void show1();  冲突
   // public final abstract void show2();冲突
   // public static abstract void show3();
    //无意义：静态方法需要加语法块{}，抽象方法.。。。
}